/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.worsik.vypocty.topeni.tepelneztraty;

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import cz.worsik.vypocty.topeni.tepelneztraty.dao.IInicializaceDbDao;
import cz.worsik.vypocty.topeni.tepelneztraty.service.ISvetoveStranyService;
import cz.worsik.vypocty.topeni.tepelneztraty.view.TepelneZtratyFrame;
import javax.swing.JOptionPane;

import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.CannotGetJdbcConnectionException;

/**
 *
 * @author 231260
 */
public class TepelneZtratyMain {

	public static final String VERZE = "0.1";

    private static final Logger log = LoggerFactory.getLogger(TepelneZtratyMain.class);
	
	/**
	 * @param args the command line arguments
	 */
	public static void main(String[] args) throws UnsupportedLookAndFeelException {
        log.info("verze: " + VERZE);
		UIManager.setLookAndFeel(new WindowsLookAndFeel());
        new TepelneZtratyMain().inicializaceAplikace();
	}
	
	/**
     * Zavola inicializaci Springu a databaze a otevre hlavni okno
     */
    private boolean inicializaceAplikace() {
        log.info("inicializace aplikace");
        BeanFactory factory = inicializaceSpringu();

        try {
            inicializaceDb(factory);
			
			spustView(factory);
			
			return true;
			
        } catch (CannotGetJdbcConnectionException e) {
            log.error("Nepodarilo se pripojit k lok. databazi", e);
            JOptionPane.showMessageDialog(null,
                    "Nelze se připojit k lokální databázi. Neběží jiná instance aplikace ?",
                    "Chyba při spouštění aplikace", JOptionPane.ERROR_MESSAGE);
			
			return false;
        }
    }
	
	/**
     * Vytvori Spring context a vrati BeanFactory.
     * 
     * @return Spring Bean Factory
     */
    protected BeanFactory inicializaceSpringu() {

        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {
                "PersistenceContext.xml", "DAOContext.xml", "ServiceContext.xml", "ViewContext.xml" 
		});
        // of course, an ApplicationContext is just a BeanFactory
        return (BeanFactory) appContext;

    }
	
	/**
     * Spusti inicializaci databaze, ktera zjisti jestli je v db vytvoreno
     * schema a pokud ne, tak ho vytvori.
     * 
     * @param factory
     *            Spring Bean Factory
     */
    private void inicializaceDb(BeanFactory factory) {
        IInicializaceDbDao inicializaceDbDao = (IInicializaceDbDao) factory.getBean("inicializaceDbDao");
		
		ISvetoveStranyService svetoveStranyService = (ISvetoveStranyService) factory.getBean("svetoveStranyService");

        inicializaceDbDao.inicializovat();
		
		svetoveStranyService.inicializovat();
    }

	private void spustView(BeanFactory factory) {
		final BeanFactory finalFactory = factory;
			
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				TepelneZtratyFrame frame = (TepelneZtratyFrame) finalFactory.getBean("tepelneZtratyFrame");
				frame.createFrame();
			}
		});
	}
}
